﻿using System;
using SQLite;
using Wino.Core.Domain.Entities.Mail;
using Wino.Core.Domain.Enums;

namespace Wino.Core.Domain.Entities.Shared;

public class MailAccount
{
    [PrimaryKey]
    public Guid Id { get; set; }

    /// <summary>
    /// Given name of the account in Wino.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// TODO: Display name of the authenticated user/account.
    /// API integrations will query this value from the API.
    /// IMAP is populated by user on setup dialog.
    /// </summary>

    public string SenderName { get; set; }

    /// <summary>
    /// Account e-mail address.
    /// </summary>
    public string Address { get; set; }

    /// <summary>
    /// Provider type of the account. Outlook,Gmail etc...
    /// </summary>
    public MailProviderType ProviderType { get; set; }

    /// <summary>
    /// For tracking mail change delta.
    /// Gmail  : historyId
    /// Outlook: deltaToken
    /// </summary>
    public string SynchronizationDeltaIdentifier { get; set; }

    /// <summary>
    /// For tracking calendar change delta.
    /// Gmail: It's per-calendar, so unused.
    /// Outlook: deltaLink
    /// </summary>
    public string CalendarSynchronizationDeltaIdentifier { get; set; }

    /// <summary>
    /// TODO: Gets or sets the custom account identifier color in hex.
    /// </summary>
    public string AccountColorHex { get; set; }

    /// <summary>
    /// Base64 encoded profile picture of the account.
    /// </summary>
    public string Base64ProfilePictureData { get; set; }

    /// <summary>
    /// Gets or sets the listing order of the account in the accounts list.
    /// </summary>
    public int Order { get; set; }

    /// <summary>
    /// Gets or sets whether the account has any reason for an interactive user action to fix continue operating.
    /// </summary>
    public AccountAttentionReason AttentionReason { get; set; }

    /// <summary>
    /// Gets or sets the id of the merged inbox this account belongs to.
    /// </summary>
    public Guid? MergedInboxId { get; set; }

    /// <summary>
    /// Gets or sets the additional IMAP provider assignment for the account.
    /// Providers that use IMAP as a synchronizer but have special requirements.
    /// </summary>
    public SpecialImapProvider SpecialImapProvider { get; set; }

    /// <summary>
    /// Contains the merged inbox this account belongs to.
    /// Ignored for all SQLite operations.
    /// </summary>
    [Ignore]
    public MergedInbox MergedInbox { get; set; }

    /// <summary>
    /// Populated only when account has custom server information.
    /// </summary>

    [Ignore]
    public CustomServerInformation ServerInformation { get; set; }

    /// <summary>
    /// Account preferences.
    /// </summary>
    [Ignore]
    public MailAccountPreferences Preferences { get; set; }

    /// <summary>
    /// Gets whether the account can perform ProfileInformation sync type.
    /// </summary>
    public bool IsProfileInfoSyncSupported => ProviderType == MailProviderType.Outlook || ProviderType == MailProviderType.Gmail;

    /// <summary>
    /// Gets whether the account can perform AliasInformation sync type.
    /// </summary>
    public bool IsAliasSyncSupported => ProviderType == MailProviderType.Gmail;
}
